/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package op.filtros;

import core.FiltraLigacao;
import elemento.ClienteTelefone;
import elemento.Empresa;
import in_out.ComunicaBD;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import op.ContaTelefonica;
import op.Ligacao;
import user_gui.FramePrincipal;

/**
 *
 * @author Jônatas
 */
public class FiltraPorEmpresa implements FiltraLigacao {

    private Collection<Empresa> empresa;

    public enum OrigemDestino {

        ORIGEM, DESTINO;
    }
    private OrigemDestino deOndeVeio;

    public FiltraPorEmpresa(Collection<Empresa> id_empresa, OrigemDestino deOndeVeio) {
        this.empresa = id_empresa;
        this.deOndeVeio = deOndeVeio;
    }

    private List<String> getTelefones() {

        ComunicaBD comunica = new ComunicaBD(FramePrincipal.bdName);

        List<ClienteTelefone> clientes = new ArrayList<ClienteTelefone>();

        for (Empresa i : empresa) {
            try {
                clientes.addAll(comunica.selectByEmpresa(FramePrincipal.tableName, i.getId()));
            } catch (SQLException ex) {
                Logger.getLogger(FiltraPorEmpresa.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        List<String> fones = new ArrayList<String>();
        for (ClienteTelefone cliente : clientes) {
            fones.add(cliente.getTelefone());
        }

        return fones;

    }

    public ContaTelefonica execute(ContaTelefonica contaOriginal) {
        List<Ligacao> ligacoesOriginais = contaOriginal.getLigacoes();
        List<Ligacao> ligacoesFiltradas = new ArrayList<Ligacao>();

        List<String> fones = getTelefones();


        for (Ligacao lig : ligacoesOriginais) {

            String fone = null;

            if (this.deOndeVeio.equals(OrigemDestino.ORIGEM)) {
                fone = lig.getNumeroDeOrigem().toUnformattedString();
            } else if (this.deOndeVeio.equals(OrigemDestino.DESTINO)) {
                fone = lig.getDestino().toUnformattedString();
            }

            if (fones.contains(fone)) {
                ligacoesFiltradas.add(lig);
            }
        }

        ContaTelefonica resposta = new ContaTelefonica(contaOriginal.getContaMensal());
        resposta.setLigacoes(ligacoesFiltradas);
        return resposta;
    }
}
